Unique's Blog

PBC|PBCWrapper 密码学库

2024-03-06 · 434字 · 3 min read
🏷️  Crypto C++

pcb密码学库的简单介绍和示例使用

官网:

安装和介绍

参考这两篇文章

示例

BLS签名和验证

//* BLS签名: https://crypto.stanford.edu/pbc/manual/ch02.html
#include "PBC.h"

int main() {
    //初始化配对变量e
    char param[1024];
    FILE* file = fopen("a.param", "r");
    size_t count = fread(param, 1, 1024, file);
    fclose(file);
    if (!count)
        pbc_die("input error");

    // 初始化配对变量e
    Pairing e(param, count);

    // 生成系统参数g
    G2 g(e, false); // TODO 随机初始化一个系统参数g(论文中通常使用生成元)
    g.dump(stdout, "system parameter g", 16);

    // 生成私钥和公钥
    Zr secret_key(e, true); // 生成一个Zr类型的secret_key
    secret_key.dump(stdout, "secret key");
    G2 public_key = g ^ secret_key; // 指数运算
    public_key.dump(stdout, "public key");

    // 假设消息m的hash值为 "hashofmessage"
    G1 h(e, (void*)"hashofmessage", 13); // 将消息hash值映射到G1元素h
    h.dump(stdout, "message hash");
    // 对消息m进行签名(对元素h签名)
    G1 sig = h ^ secret_key;
    sig.dump(stdout, "signature"); // 实际中,可以只输出第一个坐标(但是x坐标对应2个元素-椭圆曲线对称性,配对测试需要2次)

    // 验证签名
    GT temp1 = e(sig, g); // 配对运算
    GT temp2 = e(h, public_key);
    cout << endl;
    temp1.dump(stdout, "e(sig, g)");
    temp2.dump(stdout, "e(h, public_key)");
    if (temp1 == temp2)
        cout << "signature verifies" << endl;
    else
        cout << "signature does not verify" << endl;
}

备注

  • Python、Java和Go也有对应的包装版本

本文链接: PBC|PBCWrapper 密码学库

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

发布日期: 2024-03-06

最新构建: 2024-12-26

本文已被阅读 0 次,该数据仅供参考

欢迎任何与文章内容相关并保持尊重的评论😊 !

共 43 篇文章 | Powered by Gridea | RSS
©2020-2024 Nuo. All rights reserved.